#include <stdio.h>
#include "FichBits.h"

static TFichBits FichES[3];

int contador = 0;

//
// Rutinas para escribir en fichero
//

int InicializaEscritura(char *nombreStream, char* nombreContexto, char* nombreLong)
{
  if ((FichES[STREAM].fich=fopen(nombreStream,"wb"))==NULL) return 1;
  FichES[STREAM].salida_byte = 0x00;
  FichES[STREAM].pos=8;

  if ((FichES[CONTEXT].fich=fopen(nombreContexto,"wb"))==NULL) return 1;
  FichES[CONTEXT].salida_byte = 0x00;
  FichES[CONTEXT].pos=8;

  if ((FichES[LONG].fich=fopen(nombreLong,"wb"))==NULL) return 1;
  FichES[LONG].salida_byte = 0x00;
  FichES[LONG].pos=8;
  return 0;
}

// escribe una palabra de nbits en el fichero
void EscribePalabra(int nbits, int palabra, int id)
{
  while (nbits>FichES[id].pos)
  {
		nbits-=FichES[id].pos;
		FichES[id].salida_byte |= (palabra>>nbits);
		putc((int)FichES[id].salida_byte,FichES[id].fich);
		FichES[id].pos=8;
		FichES[id].salida_byte=0;
  }
  FichES[id].pos-=nbits;
  FichES[id].salida_byte |= (palabra<<FichES[id].pos);
}

// escribe un bit en el fichero
void EscribeBit(int bit,int id)
{
    contador ++;
     EscribePalabra(1,bit,id);
}

void FinalizaEscritura(int id)
{
  if (FichES[id].pos!=8) putc((int)FichES[id].salida_byte,FichES[id].fich);
  fclose(FichES[id].fich);
}

//
// Rutinas para leer de fichero
//

int InicializaLectura(char *nombre, char * nombre2, char* nombre3)
{
  if ((FichES[STREAM].fich=fopen(nombre,"rb"))==NULL) return 1;
  FichES[STREAM].quedan=FichES[STREAM].entrada_byte = 0;
  FichES[STREAM].entrada_byte=getc(FichES[STREAM].fich);
  FichES[STREAM].quedan=8;

  if ((FichES[CONTEXT].fich=fopen(nombre2,"rb"))==NULL) return 1;
  FichES[CONTEXT].quedan=FichES[CONTEXT].entrada_byte = 0;
  FichES[CONTEXT].entrada_byte=getc(FichES[CONTEXT].fich);
  FichES[CONTEXT].quedan=8;

  if ((FichES[LONG].fich=fopen(nombre3,"rb"))==NULL) return 1;
  FichES[LONG].quedan=FichES[LONG].entrada_byte = 0;
  FichES[LONG].entrada_byte=getc(FichES[LONG].fich);
  FichES[LONG].quedan=8;

  return 0;
}

// lee una palabra de nbits del fichero
int LeePalabra(int nbits,int id)
{
  int f,palabra=0;
  for (f=0;f<nbits;f++)
    palabra=(palabra<<1)|LeeBit(id);
  return palabra;
}

// lee un bit del fichero
int LeeBit(int id)
{
  int bit;
  if (FichES[id].quedan==0)
  {
		FichES[id].entrada_byte=getc(FichES[id].fich);
		FichES[id].quedan=8;
  }
  bit=(FichES[id].entrada_byte&0x80)>>7;
  FichES[id].entrada_byte<<=1;
  FichES[id].quedan--;
  return bit;
}

void FinalizaLectura(int id)
{
  fclose(FichES[id].fich);
}
